home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 02 / 0 / DISK0202.ZIP / EXMEM.ASM < prev    next >
Assembly Source File  |  1984-01-01  |  7KB  |  231 lines

  1.     INCLUDE    C:TITLE.MAC
  2.     .TITLE    <EXMEM -- Extended Memory Functions>
  3.     .SBTTL    History
  4.  
  5. ; exmem.asm  20 Dec 83  Craig Milo Rogers at USC/ISI
  6. ;    Added peek() and poke(), and variants.
  7. ; exmem.asm  15 Nov 83  Craig Milo Rogers at USC/ISI
  8. ;    Converted to PDP11-style TITLEs.
  9. ; exmem.asm  8 Sep 83  Craig Milo Rogers at USC/ISI
  10. ;    Converted to multi-model Lattice C.
  11. ; exmem.asm  24 Aug 83  Craig Milo Rogers at USC/ISI
  12. ;    Created this module to access extended memory.
  13.  
  14.     .SBHED    Declarations
  15.  
  16. ;    This module defines subroutines for manipulating extended memory,
  17. ; by which I mean memory which can't normally be referenced by the Lattice
  18. ; C complier.
  19.  
  20. IF1
  21.     INCLUDE    C:DOS.MAC        ; C segments.
  22.     INCLUDE C:BMAC.MAC        ; C procedure calls.
  23. ELSE
  24. ;    INCLUDE    C:DOS.MAC        ; C segments.
  25. ;    INCLUDE C:BMAC.MAC        ; C procedure calls.
  26. ENDIF
  27.  
  28.     PSEG                ; Only code from here on.
  29.  
  30.     .SBHED    <GETADDR -- Return a 20-bit Address>
  31.  
  32. ; name        getaddr -- return a 20-bit address
  33. ;
  34. ; synopsis    a = getaddr(p);
  35. ;        PTR p;        points to something
  36. ;        long a;        returned value
  37. ;
  38. ; description    Converts a pointer to a 20-bit address, for DMA
  39. ;        transfers, peek/poke, etc.
  40. ;
  41.  
  42. IF LDATA
  43.     BENTRY    GETADDR <OFFXX,SEGXX>
  44.     MOV    BX,SEGXX    ; Load segment part of pointer.
  45. ELSE
  46.     BENTRY    GETADDR <OFFXX>
  47.     MOV    BX,DS        ; Get segment part of address.
  48. ENDIF
  49.     MOV    AL,BH        ; Copy byte with high 4 bits.
  50.     XOR    AH,AH        ; Clear rest of high-order return register.
  51.     MOV    CL,4        ; Get shift count.
  52.     SAR    AX,CL        ; Isolate high-order 4 bits.
  53.     SHL    BX,CL        ; Justify lower 12 bits.
  54.     ADD    BX,OFFXX    ; Add in lower bits of address.
  55.     ADC    AX,0        ; Propogate carry, if any.
  56.  
  57.     BEND    GETADDR        ; Return with result in AX & BX.
  58.                 ; (AX is high, BX is low)
  59.  
  60.     .SBHED    <PEEK -- Return the Contents of a Location>
  61.  
  62. ; name        peek -- return the contents of a location
  63. ;
  64. ; synopsis    v = peek(a);
  65. ;        long a;        20-bit address
  66. ;        int v;        returned value
  67. ;
  68. ; description    Gets the contents of a location.  This routine is
  69. ;        inherently machine-specific.  The address is in
  70. ;        20-bit integer format.  The value returned is a
  71. ;        16-bit integer.
  72. ;
  73.  
  74.     BENTRY    PEEK <LOW16,HGH4>
  75.  
  76.     MOV    SI,LOW16    ; Get low 16 bits of address.
  77.     MOV    AX,HGH4        ; Get high four bits (right justified).
  78.     MOV    CX,12        ; Need to left justify high bits
  79.     SHL    AX,CL        ;   to make segment part of addr.
  80.     MOV    ES,AX        ; Transfer into extra segment register.
  81.     MOV    AX,ES:[SI]    ; Get the value of the location.
  82.  
  83.     BEND    PEEK        ; Return with result in AX.
  84.  
  85.     .SBHED    <CPEEK -- Return the Char Contents of a Location>
  86.  
  87. ; name        cpeek -- return the character contents of a location
  88. ;
  89. ; synopsis    c = cpeek(a);
  90. ;        long a;        20-bit address
  91. ;        u_char c;    returned value
  92. ;
  93. ; description    Gets the contents of a location.  This routine is
  94. ;        inherently machine-specific.  The address is in
  95. ;        20-bit integer format.  The value returned is an
  96. ;        8-bit unsigned char.
  97. ;
  98. ;
  99.  
  100.     BENTRY    CPEEK <LOW16,HGH4>
  101.  
  102.     MOV    SI,LOW16    ; Get low 16 bits of address.
  103.     MOV    AX,HGH4        ; Get high four bits (right justified).
  104.     MOV    CX,12        ; Need to left justify high bits
  105.     SHL    AX,CL        ;   to make segment part of addr.
  106.     MOV    ES,AX        ; Transfer into extra segment register.
  107.     MOV    AL,ES:[SI]    ; Get the value of the location.
  108.     XOR    AH,AH        ; Clear the high order bits.
  109.  
  110.     BEND    CPEEK        ; Return with result in AX.
  111.  
  112.     .SBHED    <LPEEK -- Return the Long Contents of a Location>
  113.  
  114. ; name        lpeek -- return the long contents of a location
  115. ;
  116. ; synopsis    l = lpeek(a);
  117. ;        long a;        20-bit address
  118. ;        long l;        returned value
  119. ;
  120. ; description    Gets the contents of a location.  This routine is
  121. ;        inherently machine-specific.  The address is in
  122. ;        20-bit integer format.  The value returned is a
  123. ;        32-bit long integer.
  124. ;
  125. ;
  126.  
  127.     BENTRY    LPEEK <LOW16,HGH4>
  128.  
  129.     MOV    SI,LOW16    ; Get low 16 bits of address.
  130.     MOV    AX,HGH4        ; Get high four bits (right justified).
  131.     MOV    CX,12        ; Need to left justify high bits
  132.     SHL    AX,CL        ;   to make segment part of addr.
  133.     MOV    ES,AX        ; Transfer into extra segment register.
  134.     MOV    BX,ES:[SI]    ; Get the value of the low 16 bits.
  135.     ADD    SI,2        ; Point to the high 16 bits.
  136.      JNC    LPEKNC        ;   (no overflow)
  137.     ADD    AX,1000H    ; Propogate carry.
  138.     MOV    ES,AX        ; Transfer into extra segment register.
  139. LPEKNC:    MOV    AX,ES:[SI]    ; Get the value of the high 16 bits.
  140.  
  141.     BEND    LPEEK        ; Return with result in AX and BX,
  142.                 ; High 16 bits in AX, low 16 bits in BX.
  143.  
  144.     .SBHED    <POKE -- Change the Contents of a Location>
  145.  
  146. ; name        poke -- change the contents of a location
  147. ;
  148. ; synopsis    poke(a, v);
  149. ;        long a;        20-bit address
  150. ;        int v;        new value
  151. ;
  152. ; description    Sets the contents of a location.  This routine is
  153. ;        inherently machine-specific.  The address is in
  154. ;        20-bit integer format.  The value changed is a
  155. ;        16-bit integer.
  156. ;
  157.  
  158.     BENTRY    POKE <LOW16,HGH4,VALU>
  159.  
  160.     MOV    SI,LOW16    ; Get low 16 bits of address.
  161.     MOV    AX,HGH4        ; Get high four bits (right justified).
  162.     MOV    CX,12        ; Need to left justify high bits
  163.     SHL    AX,CL        ;   to make segment part of addr.
  164.     MOV    ES,AX        ; Transfer into extra segment register.
  165.     MOV    AX,VALU        ; Get the new value.
  166.     MOV    ES:[SI],AX    ; Set the value of the location.
  167.  
  168.     BEND    POKE        ; Return.
  169.  
  170.     .SBHED    <CPOKE -- Change the Contents of a Char Location>
  171.  
  172. ; name        cpoke -- change the contents of a char location
  173. ;
  174. ; synopsis    cpoke(a, c);
  175. ;        long a;        20-bit address
  176. ;        u_char c;    new value
  177. ;
  178. ; description    Sets the contents of a location.  This routine is
  179. ;        inherently machine-specific.  The address is in
  180. ;        20-bit integer format.  The value changed is an
  181. ;        8-bit unsigned char.
  182. ;
  183.  
  184.     BENTRY    CPOKE <LOW16,HGH4,VALU>
  185.  
  186.     MOV    SI,LOW16    ; Get low 16 bits of address.
  187.     MOV    AX,HGH4        ; Get high four bits (right justified).
  188.     MOV    CX,12        ; Need to left justify high bits
  189.     SHL    AX,CL        ;   to make segment part of addr.
  190.     MOV    ES,AX        ; Transfer into extra segment register.
  191.     MOV    AL,VALU        ; Get the new value.
  192.     MOV    ES:[SI],AL    ; Set the value of the location.
  193.  
  194.     BEND    CPOKE        ; Return.
  195.  
  196.     .SBHED    <LPOKE -- Change the Contents of a Long Location>
  197.  
  198. ; name        lpoke -- change the contents of a long location
  199. ;
  200. ; synopsis    lpoke(a, v);
  201. ;        long a;        20-bit address
  202. ;        long v;        new value
  203. ;
  204. ; description    Sets the contents of a location.  This routine is
  205. ;        inherently machine-specific.  The address is in
  206. ;        20-bit integer format.  The value changed is a
  207. ;        32-bit long integer.
  208. ;
  209.  
  210.     BENTRY    LPOKE <LOW16,HGH4,LOVALU,HIVALU>
  211.  
  212.     MOV    SI,LOW16    ; Get low 16 bits of address.
  213.     MOV    AX,HGH4        ; Get high four bits (right justified).
  214.     MOV    CX,12        ; Need to left justify high bits
  215.     SHL    AX,CL        ;   to make segment part of addr.
  216.     MOV    ES,AX        ; Transfer into extra segment register.
  217.     MOV    BX,LOVALU    ; Get the low 16 bits of the new value.
  218.     MOV    ES:[SI],BX    ; Set the value of the low 16 bits.
  219.     ADD    SI,2        ; Point to the high 16 bits.
  220.      JNC    LPOKNC        ;   (no overflow)
  221.     ADD    AX,1000H    ; Propogate carry.
  222.     MOV    ES,AX        ; Transfer into extra segment register.
  223. LPOKNC:    MOV    AX,HIVALU    ; Get the high 16 bits of the new value.
  224.     MOV    ES:[SI],AX    ; Set the high 16 bits.
  225.  
  226.     BEND    LPOKE        ; Return.
  227. ;
  228. ;
  229.     ENDPS            ; End of code segment.
  230.     END
  231.